package com.pzb.picture.service.impl;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;

import com.pzb.common.config.PzbConfig;
import com.pzb.common.core.domain.TreeSelect;
import com.pzb.common.core.domain.entity.PicFile;
import com.pzb.common.utils.StringUtils;
import com.pzb.common.utils.file.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.pzb.picture.mapper.PicFileMapper;
import com.pzb.picture.service.IPicFileService;

/**
 * 图片管理Service业务层处理
 * 
 * @author pzb
 * @date 2021-09-10
 */
@Service
public class PicFileServiceImpl implements IPicFileService 
{
    @Autowired
    private PicFileMapper picFileMapper;

    /**
     * 查询图片管理
     * 
     * @param id 图片管理主键
     * @return 图片管理
     */
    @Override
    public PicFile selectPicFileById(Long id)
    {
        return picFileMapper.selectPicFileById(id);
    }

    /**
     * 查询图片管理
     *
     * @param ids 图片管理主键
     * @return 图片管理
     */
    @Override
    public List<PicFile> selectPicFileByIds(Long[] ids)
    {
        return picFileMapper.selectPicFileByIds(ids);
    }

    /**
     * 查询图片管理列表
     * 
     * @param PicFile 图片管理
     * @return 图片管理
     */
    @Override
    public List<PicFile> selectPicFileList(PicFile PicFile)
    {
        return picFileMapper.selectPicFileList(PicFile);
    }

    /**
     * 查询文件不含文件夹
     *
     * @param PicFile 图片管理
     * @return 图片管理集合
     */
    @Override
    public List<PicFile> selectPictureList(PicFile PicFile) {

        return picFileMapper.selectPictureList(PicFile);
    }

    /**
     * 新增图片管理
     * 
     * @param PicFile 图片管理
     * @return 结果
     */
    @Override
    public int insertPicFile(PicFile PicFile)
    {
        if(PicFile.getParentId().longValue() == 0){
            PicFile.setAncestors("0");
        }else {
            PicFile info = picFileMapper.selectPicFileById(PicFile.getParentId());
            PicFile.setAncestors(info.getAncestors() + "," + PicFile.getParentId());
        }
        return picFileMapper.insertPicFile(PicFile);
    }

    /**
     * 修改图片管理
     * 
     * @param PicFile 图片管理
     * @return 结果
     */
    @Override
    public int updatePicFile(PicFile PicFile)
    {
        return picFileMapper.updatePicFile(PicFile);
    }

    /**
     * 批量删除图片管理
     * 
     * @param ids 需要删除的图片管理主键
     * @return 结果
     */
    @Override
    public int deletePicFileByIds(Long[] ids)
    {

        List<PicFile> picFileList=selectPicFileByIds(ids);
        //递归查询子节点
        List<PicFile> delPicFileList=new ArrayList<>();
        getPicFileList(picFileList,delPicFileList);
        int count =0;
        Long [] delIds=new Long[delPicFileList.size()];
        for (PicFile pic:delPicFileList) {
            if(pic.getType().intValue()!=0){
                //如果不是文件夹要删除文件
                int dirLastIndex = PzbConfig.getProfile().length() + 1;
                String currentDir = StringUtils.substring(pic.getFilePath(), dirLastIndex);
                FileUtils.deleteFile(PzbConfig.getStoreFilePath()+currentDir);
                //如果是图片 同时删除缩略图
                if(pic.getType().intValue() == 1){
                    String previewDir = StringUtils.substring(pic.getPreviewPath(), dirLastIndex);
                    FileUtils.deleteFile(PzbConfig.getStoreFilePath()+previewDir);
                }
            }
            delIds[count]=pic.getId();
            count++;
        }
        return picFileMapper.deletePicFileByIds(delIds);
    }



    /**
     * 构建前端所需要下拉树结构
     * @param folders
     * @return
     */
    @Override
    public List<PicFile> buildFolderTree(List<PicFile> folders)
    {
        List<PicFile> returnList = new ArrayList<PicFile>();
        List<Long> tempList = new ArrayList<Long>();
        for (PicFile folder : folders)
        {
            tempList.add(folder.getId());
        }
        for (Iterator<PicFile> iterator = folders.iterator(); iterator.hasNext();)
        {
            PicFile folder = (PicFile) iterator.next();
            // 如果是顶级节点, 遍历该父节点的所有子节点
            if (!tempList.contains(folder.getParentId()))
            {
                recursionFn(folders, folder);
                returnList.add(folder);
            }
        }
        if (returnList.isEmpty())
        {
            returnList = folders;
        }
        return returnList;
    }

    /**
     * 构建前端所需要下拉树结构
     * @param folders
     * @return
     */
    @Override
    public List<TreeSelect> buildFolderTreeSelect(List<PicFile> folders) {
        List<PicFile> deptTrees = buildFolderTree(folders);
        return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
    }

    /**
     * 移动文件
     * @param PicFile
     * @return
     */
    @Override
    public int movePicFiles(PicFile PicFile) {
        //目标目录
        String ancestors="0";
        if(PicFile.getParentId().longValue() != 0){
            PicFile folder=picFileMapper.selectPicFileById(PicFile.getParentId());
            ancestors=folder.getAncestors()+','+folder.getId();
        }
        PicFile.setAncestors(ancestors);
        return picFileMapper.movePicFiles(PicFile);
    }

    /**
     * 递归列表
     */
    private void recursionFn(List<PicFile> list, PicFile t)
    {
        // 得到子节点列表
        List<PicFile> childList = getChildList(list, t);
        t.setChildren(childList);
        for (PicFile tChild : childList)
        {
            if (hasChild(list, tChild))
            {
                recursionFn(list, tChild);
            }
        }
    }

    /**
     * 得到子节点列表
     */
    private List<PicFile> getChildList(List<PicFile> list, PicFile t)
    {
        List<PicFile> tlist = new ArrayList<PicFile>();
        Iterator<PicFile> it = list.iterator();
        while (it.hasNext())
        {
            PicFile n = (PicFile) it.next();
            if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getId().longValue())
            {
                tlist.add(n);
            }
        }
        return tlist;
    }

    /**
     * 判断是否有子节点
     */
    private boolean hasChild(List<PicFile> list, PicFile t)
    {
        return getChildList(list, t).size() > 0 ? true : false;
    }

    //递归查询子节点
    @Override
    public List<PicFile> getPicFileList(List<PicFile> pictureList,List<PicFile> picFiles){
        for(PicFile pic : pictureList){
            if(pic.getType().intValue()==0){
                PicFile q=new PicFile();
                q.setParentId(pic.getId());
                List<PicFile> list = this.selectPicFileList(q);
                if(list.size() > 0){
                    getPicFileList(list, picFiles);
                }
            }
            picFiles.add(pic);
        }
        return picFiles;
    }

    /**
     * 根据商品id查询
     * @param goodsId
     * @return
     */
    @Override
    public List<PicFile> selectPicFileListByGoodsId(Long goodsId) {
        return picFileMapper.selectPicFileListByGoodsId(goodsId);
    }
}
